﻿#ifndef _CELL_SEMAPHORE_HPP_
#define _CELL_SEMAPHORE_HPP_

#include <chrono>
#include <thread>
#include <mutex>
#include <condition_variable>

class CELLSemaphore
{
public:
	// 阻塞当前线程
	void wait()
	{
		std::unique_lock<std::mutex> lock(_mutex);
		if (--_wait < 0)
		{
			// 阻塞等待(第二个参数是匿名函数，加上了解除等待的一个必要条件)
			_cv.wait(lock, [this]() -> bool {
				return _wakeup > 0;
			});
			--_wakeup;
		}
	}
	
	// 唤醒堵塞的一个线程
	void wakeup()
	{
		std::lock_guard<std::mutex> lock(_mutex);
		if (++_wait <= 0)
		{
			++_wakeup;
			_cv.notify_one();
		}
	}

private:
	// 改变数据缓冲区时互斥量
	std::mutex _mutex;
	// 阻塞等待-条件变量
	std::condition_variable _cv;
	// 等待计数
	int _wait = 0;
	// 唤醒计数
	int _wakeup = 0;
};

#endif // !_CELL_SEMAPHORE_HPP_
